package libra.controller;

import java.util.concurrent.TimeUnit;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import feign.Logger;
import feign.Request;
import feign.RequestInterceptor;

/**
 * OpenFeign日志的全局配置方式
 * 	实例化一个Logger.Level对象，放置进容器
 * !!!：
 *     如果希望进行局部的OpenFeign配置，则去除@Configuration注解，不将该配置类放置进容器。
 * 	   通过OpenFeign定义接口类上的@FeignClient(configuration=xxx.class)进行局部配置。
 * 
 * 总结！：
 * 	 全局配置 vs 局部配置：关键点在于当前配置类是否被IOC容器中加载
 */
//@Configuration
public class FeignConfig {
	/**
	 * 全局日志级别配置 - OpenFeign的日志级别
	 * 配置完成后，需要在yml配置文件的logging.level节点下，配置OpenFeign接口全类名的日志输出级别
	 * 日志级别：
	 *     NONE：默认级别，不显示任何日志
	 *     BASIC：仅记录请求方法、URL、响应状态码 及 执行时间
	 *     HEADERS：除了Basic中定义的信息之外，还有请求、响应的头信息
	 *     FULL：除了Headers中定义的信息之外，还有请求、响应的正文及元数据
	 */
	@Bean
	public Logger.Level feignLoggerLevel(){
		return Logger.Level.FULL;
	}
	
	/**
	 * 全局级别配置 - OpenFeign的超时设置
	 * connectTimeout：建立连接所用时间（网络状况正常的情况下，两端连接所用时间），单位根据TimeUnit自定义，默认10秒
	 * readTimeout：#连接建立后从服务器读取到可用资源的所用时间，单位根据TimeUnit自定义，默认60秒
	 */
	@Bean
	public Request.Options feignOptions() {
		return new Request.Options(2, TimeUnit.SECONDS, 10, TimeUnit.SECONDS, true);
	}
	
	/**
	 * 全局级别配置 - OpenFeign的拦截器
	 */
	@Bean
	public RequestInterceptor feignInterceptor() {
		return new FeignInterceptor();
	}
}
